home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Gloom_3 / src / akiko_1.s < prev   
Text File  |  1997-08-25  |  14KB  |  548 lines

  1.  
  2.         machine 68020
  3.  
  4. _LVOOpenLibrary EQU -552
  5. _LVOCloseLibrary EQU -414
  6.  
  7.         bra.w    initc2p     ; offset 0: initialization routines
  8.         bra.w    doc2p_1X8    ; offset 4: one pixel wide version, AGA
  9.         bra.w    doc2p_1X6    ; offset 8: one pixel wide version, EHB
  10.         bra.w    doc2p_2X8    ; offset 12: two pixel wide version, AGA
  11.         bra.w    doc2p_2X6    ; offset 16: two pixel wide version, EHB
  12.         dc.l    string        ; offset 20: address of descr string
  13.  
  14. gfxbase     dc.l    0        ; GfxBase
  15. c2p_ptr     dc.l    0        ; hardware address of Akiko register
  16.  
  17.         dc.b    '$VER: akiko_1 1.0 (4/1/96)',0
  18. string        dc.b    'A chunky to planar routine by Peter McGavin. '
  19.         dc.b    'Changes by Iain Barclay. '
  20.         dc.b    'REQUIRES AKIKO CHIP, e.g, as in CD32. '
  21.         dc.b    'Supports 6/8 bitplane, single/double width pixels.',0
  22. gfxname     dc.b    'graphics.library',0
  23.         even
  24.  
  25. gb_ChunkyToPlanarPtr equ 508
  26.  
  27. initc2p
  28.  
  29. ; create 2 tables for Gloom
  30.  
  31. ; a0=columns buffer to fill in (array of longs) for 1 wide pixs.
  32. ; a1=columns buffer for 2 wide pixs
  33. ; d0=how many columns (multiple of 32)
  34. ; a2=palette remapping array (do 256)
  35.  
  36.         move.w    #255,d1 ;#colours-1
  37. .loop        move.b    d1,(a2,d1.w)
  38.         dbf    d1,.loop
  39.  
  40. ; column offsets for 1 wide pixels
  41.  
  42. ; 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
  43. ; 16,17,18,19,20...
  44.  
  45.         move.w    d0,d1
  46.         ext.l    d1
  47.         subq.l    #1,d1
  48. .loop2        move.l    d1,(a0,d1.w*4)
  49.         dbf    d1,.loop2
  50.  
  51. ; column offsets for 2 wide pixels
  52.  
  53. ; 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
  54. ; 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
  55. ; 32,34,36,38,40,...
  56.  
  57.         lsr.w    #5,d0
  58.         subq.w    #1,d0
  59.         moveq    #0,d1
  60. .loop3        moveq    #15,d2
  61. .loop4        move.l    d1,(a1)+
  62.         addq.l    #2,d1
  63.         dbf    d2,.loop4
  64.         sub.l    #31,d1
  65.         moveq    #15,d2
  66. .loop5        move.l    d1,(a1)+
  67.         addq.l    #2,d1
  68.         dbf    d2,.loop5
  69.         subq.l    #1,d1
  70.         dbf    d0,.loop3
  71.  
  72. ; open graphics.library and retrieve gb_ChunkyToPlanarPtr
  73.  
  74.         lea    (gfxname,pc),a1
  75.         moveq    #40,d0
  76.         move.l    (4).w,a6
  77.         jsr    (_LVOOpenLibrary,a6)
  78.         lea    (gfxbase,pc),a0
  79.         move.l    d0,(a0)     ; save gfxbase
  80.         beq    .end
  81.         movea.l d0,a1        ; a1 = gfxbase
  82.         move.l    (gb_ChunkyToPlanarPtr,a1),(c2p_ptr-gfxbase,a0)
  83.         jsr    (_LVOCloseLibrary,a6)
  84. .end
  85.         rts
  86.  
  87.         cnop    0,4
  88. doc2p_1X8
  89. ; inputs:
  90. ; a0.l=src chunky buffer
  91. ; a1.l=dest chipmem bitmap
  92. ; d0.w=width (in pixels - multiple of 32) to convert
  93. ; d1.w=height (in pixels - even)
  94. ; d2.l=modulo from one bitplane to next (copmod-ish)
  95. ; d3.l=modulo from start of one line to start of next (linemod)
  96.  
  97. ; internal:
  98. ; a2=subtract at end of one loop
  99. ; a3=akiko hardware register ptr
  100. ; a5=bitplane modulo, 1 bp to next
  101. ; d3=add at end of line
  102. ; d5=counter
  103.  
  104.         move.l    (c2p_ptr,pc),d4
  105.         beq    .return
  106.         movea.l d4,a3    ; a3 -> akiko hardware register
  107.  
  108.         movea.l d2,a5    ; a5 = bpmod
  109.  
  110.         lsl.l    #3,d2    ; 8 bitplanes
  111.         movea.l d2,a2    ; 8 * bpmod
  112.         suba.l    a5,a2    ; 7 * bpmod
  113.         subq.l    #4,a2    ; a2 = 7 * bpmod - 4
  114.  
  115.         lsr.w    #5,d0    ; num 32 pixels per row
  116.         move.w    d0,d2
  117.         lsl.w    #2,d2    ; num 8 pixels per row (dest bytesperrow)
  118.         ext.l    d2    ; bytesperrow
  119.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  120.  
  121.         subq.w    #1,d1    ; d1 = height - 1
  122.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  123.  
  124. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  125.  
  126. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  127.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  128.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  129.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  130.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  131.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  132.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  133.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  134.  
  135.         move.l    (a3),(a1)    ; plane 0
  136.         adda.l    a5,a1        ; +bpmod
  137.         move.l    (a3),(a1)    ; plane 1
  138.         adda.l    a5,a1        ; +bpmod
  139.         move.l    (a3),(a1)    ; plane 2
  140.         adda.l    a5,a1        ; +bpmod
  141.         move.l    (a3),(a1)    ; plane 3
  142.         adda.l    a5,a1        ; +bpmod
  143.         move.l    (a3),(a1)    ; plane 4
  144.         adda.l    a5,a1        ; +bpmod
  145.         move.l    (a3),(a1)    ; plane 5
  146.         adda.l    a5,a1        ; +bpmod
  147.         move.l    (a3),(a1)    ; plane 6
  148.         adda.l    a5,a1        ; +bpmod
  149.         move.l    (a3),(a1)    ; plane 7
  150.         suba.l    a2,a1        ; -7*bpmod+4
  151.  
  152.         dbra    d5,.innerloop
  153.  
  154.         adda.l    d3,a1        ; dest skip
  155.  
  156.         dbra    d1,.rowloop    ; next row
  157.  
  158. .return
  159.         rts
  160.  
  161.         cnop    0,4
  162. doc2p_1X6
  163. ; inputs:
  164. ; a0.l=src chunky buffer
  165. ; a1.l=dest chipmem bitmap
  166. ; d0.w=width (in pixels - multiple of 32) to convert
  167. ; d1.w=height (in pixels - even)
  168. ; d2.l=modulo from one bitplane to next (copmod-ish)
  169. ; d3.l=modulo from start of one line to start of next (linemod)
  170.  
  171. ; internal:
  172. ; a2=subtract at end of one loop
  173. ; a3=akiko hardware register ptr
  174. ; a5=bitplane modulo, 1 bp to next
  175. ; d3=add at end of line
  176. ; d5=counter
  177.  
  178.         move.l    (c2p_ptr,pc),d4
  179.         beq    .return
  180.         movea.l d4,a3    ; a3 -> akiko hardware register
  181.  
  182.         movea.l d2,a5    ; a5 = bpmod
  183.  
  184.         lsl.l    #2,d2    ; 6 bitplanes
  185.         movea.l d2,a2    ; 4 * bpmod
  186.         adda.l    a5,a2    ; 5 * bpmod
  187.         subq.l    #4,a2    ; a2 = 5 * bpmod - 4
  188.  
  189.         lsr.w    #5,d0    ; num 32 pixels per row
  190.         move.w    d0,d2
  191.         lsl.w    #2,d2    ; num 8 pixels per row (dest bytesperrow)
  192.         ext.l    d2    ; bytesperrow
  193.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  194.  
  195.         subq.w    #1,d1    ; d1 = height - 1
  196.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  197.  
  198. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  199.  
  200. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  201.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  202.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  203.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  204.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  205.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  206.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  207.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  208.  
  209.         move.l    (a3),(a1)    ; plane 0
  210.         adda.l    a5,a1        ; +bpmod
  211.         move.l    (a3),(a1)    ; plane 1
  212.         adda.l    a5,a1        ; +bpmod
  213.         move.l    (a3),(a1)    ; plane 2
  214.         adda.l    a5,a1        ; +bpmod
  215.         move.l    (a3),(a1)    ; plane 3
  216.         adda.l    a5,a1        ; +bpmod
  217.         move.l    (a3),(a1)    ; plane 4
  218.         adda.l    a5,a1        ; +bpmod
  219.         move.l    (a3),(a1)    ; plane 5
  220.         suba.l    a2,a1        ; -5*bpmod+4
  221.  
  222.         dbra    d5,.innerloop
  223.  
  224.         adda.l    d3,a1        ; dest skip
  225.  
  226.         dbra    d1,.rowloop    ; next row
  227.  
  228. .return
  229.         rts
  230.  
  231.         cnop    0,4
  232. doc2p_2X8
  233. ; inputs:
  234. ; a0.l=src chunky buffer
  235. ; a1.l=dest chipmem bitmap
  236. ; d0.w=width (in pixels - multiple of 32) to convert
  237. ; d1.w=height (in pixels - even)
  238. ; d2.l=modulo from one bitplane to next (copmod-ish)
  239. ; d3.l=modulo from start of one line to start of next (linemod)
  240.  
  241. ; internal:
  242. ; a2=subtract at end of one loop
  243. ; a3=akiko hardware register ptr
  244. ; a5=bitplane modulo, 1 bp to next
  245. ; d3=add at end of line
  246. ; d5=counter
  247.  
  248.         move.l    (c2p_ptr,pc),d4
  249.         beq    .return
  250.         movea.l d4,a3    ; a3 -> akiko hardware register
  251.  
  252.         movea.l d2,a5    ; a5 = bpmod
  253.  
  254.         lsl.l    #3,d2    ; 8 bitplanes
  255.         movea.l d2,a2    ; 8 * bpmod
  256.         suba.l    a5,a2    ; 7 * bpmod
  257.         subq.l    #4,a2    ; a2 = 7 * bpmod - 4
  258.  
  259.         lsr.w    #5,d0    ; num 32 pixels per row
  260.         move.w    d0,d2
  261.         lsl.w    #3,d2    ; num 4 pixels per row (dest bytesperrow)
  262.         ext.l    d2    ; bytesperrow
  263.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  264.  
  265.         subq.l    #4,a5    ; a5 = bpmod - 4
  266.  
  267.         move.l    #$aaaaaaaa,d7
  268.  
  269.         subq.w    #1,d1    ; d1 = height - 1
  270.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  271.  
  272. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  273.  
  274. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  275.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  276.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  277.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  278.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  279.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  280.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  281.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  282.  
  283.         move.l    (a3),d2     ; plane 0 from Akiko
  284.         move.l    d2,d4
  285.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  286.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  287.         move.l    d2,d6
  288.         lsr.l    #1,d6
  289.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  290.         move.l    d2,(a1)+    ; plane 0
  291.         move.l    d4,d6
  292.         add.l    d6,d6
  293.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  294.         move.l    (a3),d2     ; plane 1 from Akiko
  295.         move.l    d6,(a1)     ; plane 0
  296.         adda.l    a5,a1
  297.  
  298.         move.l    d2,d4
  299.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  300.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  301.         move.l    d2,d6
  302.         lsr.l    #1,d6
  303.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  304.         move.l    d2,(a1)+    ; plane 1
  305.         move.l    d4,d6
  306.         add.l    d6,d6
  307.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  308.         move.l    (a3),d2     ; plane 2 from Akiko
  309.         move.l    d6,(a1)     ; plane 1
  310.         adda.l    a5,a1
  311.  
  312.         move.l    d2,d4
  313.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  314.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  315.         move.l    d2,d6
  316.         lsr.l    #1,d6
  317.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  318.         move.l    d2,(a1)+    ; plane 2
  319.         move.l    d4,d6
  320.         add.l    d6,d6
  321.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  322.         move.l    (a3),d2     ; plane 3 from Akiko
  323.         move.l    d6,(a1)     ; plane 2
  324.         adda.l    a5,a1
  325.  
  326.         move.l    d2,d4
  327.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  328.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  329.         move.l    d2,d6
  330.         lsr.l    #1,d6
  331.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  332.         move.l    d2,(a1)+    ; plane 3
  333.         move.l    d4,d6
  334.         add.l    d6,d6
  335.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  336.         move.l    (a3),d2     ; plane 4 from Akiko
  337.         move.l    d6,(a1)     ; plane 3
  338.         adda.l    a5,a1
  339.  
  340.         move.l    d2,d4
  341.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  342.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  343.         move.l    d2,d6
  344.         lsr.l    #1,d6
  345.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  346.         move.l    d2,(a1)+    ; plane 4
  347.         move.l    d4,d6
  348.         add.l    d6,d6
  349.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  350.         move.l    (a3),d2     ; plane 5 from Akiko
  351.         move.l    d6,(a1)     ; plane 4
  352.         adda.l    a5,a1
  353.  
  354.         move.l    d2,d4
  355.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  356.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  357.         move.l    d2,d6
  358.         lsr.l    #1,d6
  359.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  360.         move.l    d2,(a1)+    ; plane 5
  361.         move.l    d4,d6
  362.         add.l    d6,d6
  363.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  364.         move.l    (a3),d2     ; plane 6 from Akiko
  365.         move.l    d6,(a1)     ; plane 5
  366.         adda.l    a5,a1
  367.  
  368.         move.l    d2,d4
  369.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  370.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  371.         move.l    d2,d6
  372.         lsr.l    #1,d6
  373.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  374.         move.l    d2,(a1)+    ; plane 6
  375.         move.l    d4,d6
  376.         add.l    d6,d6
  377.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  378.         move.l    (a3),d2     ; plane 7 from Akiko
  379.         move.l    d6,(a1)     ; plane 6
  380.         adda.l    a5,a1
  381.  
  382.         move.l    d2,d4
  383.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  384.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  385.         move.l    d2,d6
  386.         lsr.l    #1,d6
  387.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  388.         move.l    d2,(a1)+    ; plane 7
  389.         move.l    d4,d6
  390.         add.l    d6,d6
  391.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  392.         move.l    d6,(a1)     ; plane 7
  393.         suba.l    a2,a1        ; -7*bpmod+4
  394.  
  395.         dbra    d5,.innerloop
  396.  
  397.         adda.l    d3,a1        ; dest skip
  398.  
  399.         dbra    d1,.rowloop    ; next row
  400. .return
  401.         rts
  402.  
  403.         cnop    0,4
  404. doc2p_2X6
  405. ; inputs:
  406. ; a0.l=src chunky buffer
  407. ; a1.l=dest chipmem bitmap
  408. ; d0.w=width (in pixels - multiple of 32) to convert
  409. ; d1.w=height (in pixels - even)
  410. ; d2.l=modulo from one bitplane to next (copmod-ish)
  411. ; d3.l=modulo from start of one line to start of next (linemod)
  412.  
  413. ; internal:
  414. ; a2=subtract at end of one loop
  415. ; a3=akiko hardware register ptr
  416. ; a5=bitplane modulo, 1 bp to next
  417. ; d3=add at end of line
  418. ; d5=counter
  419.  
  420.         move.l    (c2p_ptr,pc),d4
  421.         beq    .return
  422.         movea.l d4,a3    ; a3 -> akiko hardware register
  423.  
  424.         movea.l d2,a5    ; a5 = bpmod
  425.  
  426.         lsl.l    #2,d2    ; 6 bitplanes
  427.         movea.l d2,a2    ; 4 * bpmod
  428.         adda.l    a5,a2    ; 5 * bpmod
  429.         subq.l    #4,a2    ; a2 = 5 * bpmod - 4
  430.  
  431.         lsr.w    #5,d0    ; num 32 pixels per row
  432.         move.w    d0,d2
  433.         lsl.w    #3,d2    ; num 4 pixels per row (dest bytesperrow)
  434.         ext.l    d2    ; bytesperrow
  435.         sub.l    d2,d3    ; d3 = linemod - bytesperrow
  436.  
  437.         subq.l    #4,a5    ; a5 = bpmod - 4
  438.  
  439.         move.l    #$aaaaaaaa,d7
  440.  
  441.         subq.w    #1,d1    ; d1 = height - 1
  442.         subq.w    #1,d0    ; d0 = num 32 pixels per row - 1
  443.  
  444. .rowloop    move.w    d0,d5        ; num 32 pixels per row - 1
  445.  
  446. .innerloop    move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  447.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  448.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  449.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  450.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  451.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  452.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  453.         move.l    (a0)+,(a3)    ; next 4 pixels -> Akiko
  454.  
  455.         move.l    (a3),d2     ; plane 0 from Akiko
  456.         move.l    d2,d4
  457.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  458.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  459.         move.l    d2,d6
  460.         lsr.l    #1,d6
  461.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  462.         move.l    d2,(a1)+    ; plane 0
  463.         move.l    d4,d6
  464.         add.l    d6,d6
  465.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  466.         move.l    (a3),d2     ; plane 1 from Akiko
  467.         move.l    d6,(a1)     ; plane 0
  468.         adda.l    a5,a1
  469.  
  470.         move.l    d2,d4
  471.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  472.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  473.         move.l    d2,d6
  474.         lsr.l    #1,d6
  475.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  476.         move.l    d2,(a1)+    ; plane 1
  477.         move.l    d4,d6
  478.         add.l    d6,d6
  479.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  480.         move.l    (a3),d2     ; plane 2 from Akiko
  481.         move.l    d6,(a1)     ; plane 1
  482.         adda.l    a5,a1
  483.  
  484.         move.l    d2,d4
  485.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  486.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  487.         move.l    d2,d6
  488.         lsr.l    #1,d6
  489.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  490.         move.l    d2,(a1)+    ; plane 2
  491.         move.l    d4,d6
  492.         add.l    d6,d6
  493.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  494.         move.l    (a3),d2     ; plane 3 from Akiko
  495.         move.l    d6,(a1)     ; plane 2
  496.         adda.l    a5,a1
  497.  
  498.         move.l    d2,d4
  499.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  500.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  501.         move.l    d2,d6
  502.         lsr.l    #1,d6
  503.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  504.         move.l    d2,(a1)+    ; plane 3
  505.         move.l    d4,d6
  506.         add.l    d6,d6
  507.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  508.         move.l    (a3),d2     ; plane 4 from Akiko
  509.         move.l    d6,(a1)     ; plane 3
  510.         adda.l    a5,a1
  511.  
  512.         move.l    d2,d4
  513.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  514.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  515.         move.l    d2,d6
  516.         lsr.l    #1,d6
  517.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  518.         move.l    d2,(a1)+    ; plane 4
  519.         move.l    d4,d6
  520.         add.l    d6,d6
  521.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  522.         move.l    (a3),d2     ; plane 5 from Akiko
  523.         move.l    d6,(a1)     ; plane 4
  524.         adda.l    a5,a1
  525.  
  526.         move.l    d2,d4
  527.         and.l    d7,d2        ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
  528.         eor.l    d2,d4        ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
  529.         move.l    d2,d6
  530.         lsr.l    #1,d6
  531.         or.l    d6,d2        ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
  532.         move.l    d2,(a1)+    ; plane 5
  533.         move.l    d4,d6
  534.         add.l    d6,d6
  535.         or.l    d4,d6        ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
  536.         move.l    d6,(a1)     ; plane 5
  537.         suba.l    a2,a1        ; -5*bpmod+4
  538.  
  539.         dbra    d5,.innerloop
  540.  
  541.         adda.l    d3,a1        ; dest skip
  542.  
  543.         dbra    d1,.rowloop    ; next row
  544. .return
  545.         rts
  546.  
  547.         end
  548.